package org.usmile.algorithms.leetcode.middle;

import org.usmile.algorithms.leetcode.TreeNode;

import java.util.HashMap;
import java.util.Map;

/**
 * 106. 从中序与后序遍历序列构造二叉树
 *
 * 给定两个整数数组 inorder 和 postorder ，其中 inorder 是二叉树的中序遍历， postorder 是同一棵树的后序遍历，请你构造并返回这颗 二叉树 。
 *
 * 示例 1:
 * 输入：inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
 * 输出：[3,9,20,null,null,15,7]
 *
 * 示例 2:
 * 输入：inorder = [-1], postorder = [-1]
 * 输出：[-1]
 *
 * 提示:
 * 1 <= inorder.length <= 3000
 * postorder.length == inorder.length
 * -3000 <= inorder[i], postorder[i] <= 3000
 * inorder 和 postorder 都由 不同 的值组成
 * postorder 中每一个值都在 inorder 中
 * inorder 保证是树的中序遍历
 * postorder 保证是树的后序遍历
 */
public class _0106 {
}

class _0106_Solution {
    Map<Integer, Integer> indexMap = new HashMap<>();
    int rootIndex = 0;
    int[] postorder;

    public TreeNode buildTree(int[] inorder, int[] postorder) {
        this.rootIndex = postorder.length - 1;
        this.postorder = postorder;
        for (int i = 0; i < inorder.length; i++) {
            indexMap.put(inorder[i], i);
        }

        return buildTree(0, postorder.length - 1);
    }

    private TreeNode buildTree (int left, int right) {
        if (left > right) {
            return null;
        }

        TreeNode root = new TreeNode(postorder[rootIndex]);
        int mid = indexMap.get(postorder[rootIndex]);
        rootIndex--;
        root.right = buildTree(mid + 1, right);
        root.left = buildTree(left, mid - 1);

        return root;
    }
}